<%@ page import="org.apache.catalina.core.ApplicationContext"%>
<%@ page import="java.util.*" import="java.io.*" %>
<%@ page import="de.medieninf.webanw.*" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><%-- Methoden und Globale Variablen --%>
<%!
	// FIXME komisch viele Leerzeilen im HTML Code
	/*
	 -Code hier wird in die Servlet Klasse uebernommen NICHT in die _jspService!
	 -Funktionen in JSPs vermeiden, wenn Code oefter benoetigt auslagern in extra JSPs diese dann includieren
	 -nur LifeCycle Methoden muessen hier ueberschreiben werden wenn man das moechte
	 -Hier deklarierte Variablen sind Instanzvariablen des erzeugten Servlets und NIE Threadsicher!!
	 -in der Regel existiert ein Objekt eines Servlets (übersetzte JSP Seite)
	 -implizite JSP Objekte nicht vorhanden
	 -nur innerhalb der LifeCycle Methoden zugriff auf ServletContext (application Scope)
	*/

	// fragebogenMap und maxPunkte global definieren da jspDestroy() sie sehen muss
	SortedMap<String, SortedMap<String, Integer>> fragebogenMap = null;
	Integer maxPunkte = null;
	String fragen[] = null;
	
	// LifeCycle Methoden ueberschreiben, wird trotzdem öfter ausgefühert, jedesmal wenn Container das Erzeugte JSP neu Instanziiert
	public void jspInit() {
		// this ist hier vom Type: org.apache.jsp.frage_jsp also tatsächlich denk ich vom Interface javax.servlet.jsp.HttpJspPage
		// das erbt von Interfaces javaxservlet.jsp.JspPage und von javax.servlet.Servlet
		// in LifeCycle Methode Servlet-Umgebung keine JSP umgebung. also wieder getServletContext() usw.
		// zugriff auf application-Scope holen
		ServletContext servletContext = this.getServletContext();

		// Dateinamen aus web.xml herauslesen
		// TODO warum geht this.getInitParameter("fragebogenDatei"); nicht???
		String fragebogenDatei = this.getServletContext().getInitParameter(
				"fragebogenDatei");
		
		log("TYP this: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX: " + this.getClass().getName());

		// fragebogenMap in globale Variable einlesen
		fragebogenMap = getFragebogenMap(fragebogenDatei, servletContext);
		maxPunkte = getMaxPunkte(fragebogenMap);
		
		// fragen im extra String-Array merken, aus set von Objekts String Array erstellen 
		fragen = fragebogenMap.keySet().toArray(new String[0]);
		
// 		log("fragebogenmap: "+fragebogenMap.toString());
// 		log("maxPunkte: "+maxPunkte);
		
		// maxPunkte und fragebogenMap dem application-Scope hinzufuegen wenn noch nicht vorhanden (sollte nie vorhanden sein da jspDestroy())
		if (servletContext.getAttribute("fragebogenMap") == null) {
			log("schreibe fragebogenMap in application Context");
			servletContext.setAttribute("fragebogenMap", fragebogenMap);
		} else {
			log("Komischerweise ist 'fragebogenMap' bereits im application Scope vorhanden!");
		}
		if (servletContext.getAttribute("maxPunkte") == null) {
			log("schreibe maxPunkte in application Context");
			servletContext.setAttribute("maxPunkte", maxPunkte);
		} else {
			log("Komischerweise ist 'maxPunkte' bereits im application Scope vorhanden!");
		}
		if (servletContext.getAttribute("fragen") == null) {
			log("schreibe fragen in application Context");
			servletContext.setAttribute("fragen", fragen);
		} else {
			log("Komischerweise ist 'fragen' bereits im application Scope vorhanden!");
		}
	}

	// aufraeumen der in jspInit() gesetzten Attribute	immer machen		
	public void jspDestroy() {
		this.log("bin in destroy!");
		fragebogenMap = null;
		maxPunkte = null;
		fragen = null;
	}
	
	// fragebogenMap einlsen	
	public SortedMap<String, SortedMap<String, Integer>> getFragebogenMap(
			String fname, ServletContext servletContext) {

		SortedMap<String, SortedMap<String, Integer>> fragebogenMap = null;

		InputStream is = null;
		try {
			is = servletContext.getResourceAsStream(fname);
			fragebogenMap = FragebogenReader.getFragebogen(is);
			// man kann aus FileInputStream (das ein InputStream ist) einen BufferdInputstream machen, da ist die IO performance besser bei grossen datenmengen
			// Buffering I/O is a very common performance optimization. Java's BufferedInputStream class 
			// allows you to "wrap" any InputStream into a buffered stream and achieve this performance improvement.
		} catch (Exception ioe) {
			log("Fehler beim Einlesen von " + fname);
		} finally {
			if (is != null) {
				try {
					is.close(); // InputStream wirft checked Exception, muss behandelt werden, apache bibliothek hat extra funktione zum quiet close()
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			}
		}
		return fragebogenMap;
	}

	// maximale punkte berrechnen die moeglich sind
	public Integer getMaxPunkte(SortedMap<String, SortedMap<String, Integer>> fragebogenMap){		
		int maxP = 0;
		int maxT = 0;
		int punkte = 0;
		
		for (String frage : fragebogenMap.keySet()){
			Map<String, Integer> antworten = fragebogenMap.get(frage);
			for (String antwort : antworten.keySet()){
				punkte = antworten.get(antwort);
				maxT = maxT < punkte ? punkte : maxT;
			}
			maxP += maxT;
		}
		return maxP;
	}	
	
	// methode die mir frage nummer x als string zurueck gibt
	public String getFrage(String fragen[], Integer fNr){		
		if (fNr > fragen.length){
			throw new RuntimeException("Es gibt nur " +fragen.length+ " Fragen");
		}		
		return fragen[fNr-1];
	}
	
	// TODO
	// methode die mir alle Antworten zu frage nummer x als String Array zurueck gibt
	
	// methode die userantworten array zurueckgibt und fragebogenMap erwartet daraus die groesse des feldes berrechnet
%><%-- _jspService() --%>
<%
	// TODO
	// hole aus session: round, antworten array
	
	// 	Integer round = session.getAttribute("runde") != null ? (Integer) session.getAttribute("runde") : 1;
	// 	List<Integer> answers = session.getAttribute("antworten") != null ? (ArrayList<Integer>) session.getAttribute("antworten") : null;
%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>frage.jsp</title>
</head>
<body>
<%= getFrage( (String []) application.getAttribute("fragen"), 1) %>
</body>
</html>